/*

	TP2 - Algoritmos y Programación 2 - Cátedra Wachenchauzer - FIUBA

	Segundo Cuatrimestre 2013

	Alumno: Maximiliano Alexis Montiel
	Padrón: 93157

	Sistema Messi +10. 
	
	Implementacion del parser.

*/
#include "parser.h"

#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>

//modificado Joaquin Blanco 94653 16/11/13
//Resuelto errores con los caracteres \r\n
char *linea_siguiente(FILE *file)
{
	char *linea = (char *)malloc(sizeof(char)*256);

	if (!linea)
		return NULL;

	size_t i = 0;
	int c;
	while ((c = getc(file)) != '\0')
		{
			if ((c == '\n') || (i == 255))
				{
					linea[i] = '\0';
					break;
				}
			//
			//el retorno de carro no sera parte de la cadena
			if (c != '\r')
			{
				linea[i] = c;
				i++;
			}
		}

	char *linea_ajustada = realloc(linea,i+1);
	
	if (!linea_ajustada)
		return linea;

	return linea_ajustada;
}

bool caracter_en_cadena(char caracter, char *cadena)
{
	while (*cadena != '\0')
		{
			if (*cadena == caracter)
				return true;
			cadena++;
		}
	return false;
}

char *palabra_siguiente(char *linea, char *delimitador, size_t *offset)
{
	char *palabra = (char *)malloc(sizeof(char)*256);

	if (!palabra)
		return NULL;

	size_t i = 0;

	while ((*linea != '\0') && caracter_en_cadena(*linea,delimitador))
		linea++;

	while ((palabra[i] = linea[i]) != '\0')
		{
			if (caracter_en_cadena(palabra[i],delimitador) || (i == 255))
				{
					palabra[i] = '\0';
					break;
				}
			i++;
		}

	if (linea[i] == '\0')
		*offset = 0;
	else
		*offset = i+1;

	char *palabra_ajustada = realloc(palabra,i+1);

	if (!palabra_ajustada)
		return palabra;

	return palabra_ajustada;
}

//modificado Joaquin Blanco 94653 16/11/13
//Resuelto problemas debido a la inconsistencia en el protocolo de 
//comunicacion
lista_t *comando_extraer(char *linea)
{
	lista_t *lista = lista_crear();

	if (!lista)
		return NULL;

	size_t offset = 0;

	char *comando = palabra_siguiente(linea," ",&offset);

	if (!comando)
		{
			lista_destruir(lista,free);
			return NULL;			
		}
		
	if (!lista_insertar_primero(lista,comando))
		{
			free(comando);
			lista_destruir(lista,free);
			return NULL;
		}
	
	char *separador = " ";

	//Asigno un separador de acuerdo a la funcion.
	if (!strcmp ("agregar_resultado", comando))
		separador = ", ";
	else if (!strcmp("goles_jugador", comando))
		separador = ",";

	while (comando && offset)
		{
			linea += offset;
			comando = palabra_siguiente(linea, separador, &offset);
			lista_insertar_ultimo(lista,comando);

			//modifico el separador para que pueda aceptar
			//parametros con espacios; ej: nombres de equipos
			if (!strcmp ("listar_jugadores", lista_ver_primero (lista)))
				separador = ",";
		}
	
	return lista;
}
